"""
模板引擎模块 - 负责处理模板渲染和文件生成
"""
from jinja2 import Environment, FileSystemLoader
import os
import re
import datetime

def to_pascal_case(name):
    """转换为大驼峰命名法(PascalCase)"""
    # 处理下划线、中划线、空格等分隔符
    components = re.split(r'[_\s-]+', name)
    # 首字母大写，其余保持不变
    return ''.join(x.title() for x in components if x)


def to_camel_case(name):
    """转换为小驼峰命名法(camelCase)"""
    # 先转换为大驼峰
    pascal_case = to_pascal_case(name)
    # 然后将首字母小写
    if pascal_case:
        return pascal_case[0].lower() + pascal_case[1:]
    return pascal_case


def to_kebab_case(name):
    """转换为中划线命名法(kebab-case)"""
    # 处理下划线、空格等分隔符
    components = re.split(r'[_\s]+', name)
    # 全部小写，用中划线连接
    return '-'.join(x.lower() for x in components if x)

def to_snake_case(name):
    """转换为蛇形命名法(snake_case)"""
    # 处理中划线、空格等分隔符
    components = re.split(r'[-\s]+', name)
    # 全部小写，用下划线连接
    return '_'.join(x.lower() for x in components if x)

# 传入一个数组如果数组中包含MyLikeLink则返回True
def check_like_link(columns):
    for column in columns:
        if column['查询方式'] == 'MyLikeLink':
            return True
    return False
# 把所有的MyLikeLink的列名放到一个数组中
def get_like_link_columns(columns):
    like_link_columns = []
    for column in columns:
        if column['查询方式'] == 'MyLikeLink':
            like_link_columns.append(column['列名'])
    return "\", \"".join(like_link_columns)

# 把所有的MyLikeLink的列名放到一个数组中
def get_like_link_columns_comm(columns):
    like_link_columns = []
    for column in columns:
        if column['查询方式'] == 'MyLikeLink':
            like_link_columns.append(column['注解'])
    return "｜".join(like_link_columns)

def render_templates(config, db_model,table_name, table_comm, columns, script_dir, verbose=True,package_name="test"):
    """
    渲染配置文件中定义的所有模板
    
    参数:
    config: 配置字典
    table_name: 表名
    table_comm: 表注释
    columns: 列信息列表
    script_dir: 脚本所在目录
    verbose: 是否打印详细信息
    
    返回:
    成功生成的文件路径列表
    """
    # 记录成功生成的文件路径
    generated_files = []
    
    try:
        # 配置模版目录 - 使用相对于项目根目录的路径
        project_root = os.path.dirname(script_dir)
        template_dir = os.path.join(project_root, config['template']['directory'])
        env = Environment(loader=FileSystemLoader(template_dir))

        # 生成各种格式的表名
        table_name_formats = {
            'table_name': table_name,
            'pascal_case': to_pascal_case(table_name),
            'camel_case': to_camel_case(table_name),
            'kebab_case': to_kebab_case(table_name),
            'snake_case': to_snake_case(table_name),
            'package_name': package_name,
            'to_camel_case': to_camel_case,
            'to_kebab_case': to_kebab_case,
            'to_snake_case': to_snake_case,
            'to_pascal_case': to_pascal_case,
            'check_like_link': check_like_link,
            'get_like_link_columns_comm': get_like_link_columns_comm,
            'get_like_link_columns': get_like_link_columns,
            'now': datetime.datetime.now,
        }

        # 遍历配置中的所有模板
        templates = config['template']['templates']
        for template_config in templates:
            try:
                # 获取模板配置信息
                template_name = template_config['name']
                output_dir_relative = template_config['output_dir']
                output_filename = template_config['filename']
                
                # 处理文件名中的变量替换
                # 使用字典的format_map方法支持多种变量格式
                for var_name, var_value in table_name_formats.items():
                    var_placeholder = '{' + var_name + '}'
                    if var_placeholder in output_filename:
                        output_filename = output_filename.replace(var_placeholder, var_value)
                        
                # 构建完整的输出目录和文件路径
                output_dir = os.path.join(project_root, output_dir_relative)
                output_path = os.path.join(output_dir, output_filename)
                
                # 创建输出目录（如果不存在）
                os.makedirs(output_dir, exist_ok=True)
                
                # 检查文件是否存在，只有不存在时才生成
                if not os.path.exists(output_path):
                    # 加载并渲染模板，传递所有格式的表名
                    template = env.get_template(template_name)
                    # 将表名格式字典与其他变量合并
                    render_vars = {
                        'table_comm': table_comm,
                        'db_model': db_model,
                        'columns': columns
                    }
                    render_vars.update(table_name_formats)
                    
                    output = template.render(**render_vars)
                    
                    # 写入文件
                    with open(output_path, 'w', encoding='utf-8') as file:
                        file.write(output)
                    
                    generated_files.append(output_path)
                    if verbose:
                        print(f"成功生成文件: {output_path}")
                else:
                    if verbose:
                        print(f"文件已存在，跳过生成: {output_path}")
                
            except Exception as e:
                if verbose:
                    print(f"处理模板 {template_config.get('name', '未知')} 时出错: {str(e)}")
        
        return generated_files
        
    except Exception as e:
        if verbose:
            print(f"模板引擎初始化或执行过程出错: {str(e)}")
        return []
